package com.hb.core.oauth2;

import com.alibaba.fastjson.JSON;
import com.hb.core.context.CurrentAccountHolder;
import com.hb.core.model.SecurityClient;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.Base64Utils;

import java.nio.charset.StandardCharsets;
import java.util.Objects;

/**
 * @description: 账户鉴权工具类
 * @projectName: zhb-frame-build
 * @author: zhouhaizhi
 * @createTime: 2021/8/27 13:52
 * @version:1.0
 */
@Slf4j
public class AuthContextUtils {

    private static final String SUB_POINT = ".";

    /**
     * @描述 解析token
     * @创建人 zhouhaizhi
     * @创建时间 2021/8/27 13:54
     * @参数
     * @返回值
     * @修改人和其它信息
     */
    public static SecurityClient decodeToken(String token) {
        String[] tokenValues = StringUtils.split(token, SUB_POINT);
        if (tokenValues.length != 3) {
            return null;
        }
        byte[] base64Token = tokenValues[1].getBytes(StandardCharsets.UTF_8);
        byte[] decode = Base64Utils.decode(base64Token);
        String jsonStr = new String(decode, StandardCharsets.UTF_8);
        return JSON.parseObject(jsonStr, SecurityClient.class);

    }

    /**
     *@描述 判断token是否过期
     *@创建人 zhouhaizhi
     *@创建时间 2021/8/27 14:02
     *@参数 
     *@返回值 
     *@修改人和其它信息
     */
    public static Boolean isExpired(SecurityClient securityClient) {
        return System.currentTimeMillis() > (securityClient.getExp() * 1000);
    }

    /**
     *@描述 判断token是否过期
     *@创建人 zhouhaizhi
     *@创建时间 2021/8/27 14:02
     *@参数
     *@返回值
     *@修改人和其它信息
     */
    public static Boolean isExpired(String token) {
        return isExpired(decodeToken(token));
    }

    /**
     *@描述  判断账户对象是否过期
     *@创建人 zhouhaizhi
     *@创建时间 2021/8/27 14:05
     *@参数 
     *@返回值 
     *@修改人和其它信息
     */
    public static Boolean isAccountExpired(SecurityClient securityClient){
        return System.currentTimeMillis() > (securityClient.getExpiryTime());
    }

    /**
     *@描述  判断账户对象是否失效
     *@创建人 zhouhaizhi
     *@创建时间 2021/8/27 14:07
     *@参数 
     *@返回值 
     *@修改人和其它信息
     */
    public static Boolean isAccountInvalid(SecurityClient securityClient){
        return securityClient.getInvalid();
    }

    /**
     *@描述  获取上下文中的完整账户对象
     *@创建人 zhouhaizhi
     *@创建时间 2021/8/27 14:22
     *@参数 
     *@返回值 
     *@修改人和其它信息
     */
    public static SecurityClient getCurrentClientInfo(){
        SecurityClient accout = CurrentAccountHolder.get();
        if (!Objects.isNull(accout) && accout instanceof SecurityClient) {
            return (SecurityClient)accout;
        }
        return null;
    }
}
